asserts x is T
参考
assertionする関数に対して使う
assertionする関数とは、値の判定をして、満たさなかったら例外を投げる関数
満たした場合は特に何もしない
返り値はvoid
code:ts
function assertIsNumber(x: unknown): asserts x is number {
if (typeof x !== "number") {
throw new Error("BOOM");
}
}
関数が例外を投げずに無事に終了したならば、型述語の条件が満たすということを示す
例外を投げずに次の行に進んだということは、その型はis Tで指定したものだと確定できる
code:ts
const value = unknownValue() // unknown
assertIsNumber(value)
value // number
単にasserts xと書く場合
関数が正常終了するならばxはtruthyな値であるということを示す
option値にdefault値を入れることに応用する ref code:ts
interface Options {
foo: string;
bar: number;
}
function useOptions(options: Partial<Options>) {
// これはエラー (options.fooはundefinedかもしれないので)
console.log(options.foo.length);
// オプションを埋める
fillOptions(options);
// これはエラーにならない!!!!!
console.log(options.foo.length);
}
function fillOptions(options: Partial<Options>): asserts options is Options {
if (options.foo === undefined) {
options.foo = "";
}
if (options.bar === undefined) {
options.bar = 0;
}
}
これはassertion関数でないものに対して、assertsを使っているから違和感がある
が、確かにそういう使い方はできそう
ただmutableな感じがどうも気持ち悪い
もっと良い方法ありそう
普通にこんなのでよいだろう
code:ts
function useOptions(options: Partial<Options>) {
const { foo = "", bar = 0 } = options;
console.log(foo.length);
}